var obj = {
  name: 'jack',
  age: 18
}

Object.defineProperty(obj, 'address', {
  value: 'Bei Jing',
  configurable: false,
  enumerable: true,
  writable: true
})

/**
 * 1.configurable
 * 表示属性是否可以通过delete删除属性，是否可以修改他的特性，或者是否可以将它修改为存取属性描述符
 * 直接在对象上定义默认为true，通过属性描述符定义默认为false
 */
//因为configurable: false，不可配置，无效的配置
Object.defineProperty(obj, 'adress', {
  value: 'tt',
  configurable: true
})
//无法删除address属性
delete obj.address
console.log(obj.address) //BeiJjing

/**
 * 2.enumerable
 * 表示属性是否可以通过for-in或者Object.keys()返回该属性
 * 直接在对象上定义默认为true，通过属性描述符定义默认为false
 */
console.log(obj) //{ name: 'jack', age: 18, address: 'Bei Jing' }
console.log(Object.keys(obj))//[ 'name', 'age', 'address' ]

/**
 * 3.writable
 * 表示是是否可以修改属性的值
 * 直接在对象上定义默认为true，通过属性描述符定义默认为false
 */
obj.address = 'Tian Jin'
console.log(obj.address) //Tian Jin

/**
 * 4.value
 * 属性的value值，读取属性时会返回该值，修改属性时会对其进行修改
 * 默认值： undefined
 */
Object.defineProperty(obj, 'friend', {})
console.log(obj.friend) //undefined
